/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2023-10-06     qsy       the first version
 */
#include <OledDisplayCode.h>
//#include <U8g2lib.h>

#define OLED_I2C_PIN_SCL                    25  // PB9
#define OLED_I2C_PIN_SDA                    24  // PB8


//目标结构体指针
u8g2_t u8g2;

//--------------oled初始化---------------------------
void OledDisplayInit(u8g2_t *u8g2)
{
    //选择屏幕的型号初始化
    //后缀代表缓冲区的大小  1代表128字节，2代表256字节，f代表1024字节  缓冲区越小刷新越慢
    //noname代表特定屏幕的型号，没有要求则noname
    //函数名不带i2c的都是spi的接口
    //屏幕初始化
    //库里没有ssd1315，1306跟1315没有本质区别，除了封装方式有差异其他完全一样，可代替
    u8g2_Setup_ssd1306_i2c_128x64_noname_f( u8g2, U8G2_R0, u8x8_byte_sw_i2c, u8x8_gpio_and_delay_rtthread);

    //设置引脚
    u8x8_SetPin(u8g2_GetU8x8(u8g2), U8X8_PIN_I2C_CLOCK, OLED_I2C_PIN_SCL);
    u8x8_SetPin(u8g2_GetU8x8(u8g2), U8X8_PIN_I2C_DATA, OLED_I2C_PIN_SDA);

    //显示初始化
    u8g2_InitDisplay(u8g2);
    //开启显示
    u8g2_SetPowerSave(u8g2, 0);
    //首先清除屏幕缓存
    u8g2_ClearBuffer(u8g2);


}

//--------------显示变量的数字---------------------------
//u8g2_t *u8g2                  结构体指针
//u8g2_uint_t x, u8g2_uint_t y  x\y坐标
//const uint8_t *font           字体
//short var                     要传入的变量
//rt_uint8_t send               SEND_TRUE 发送到oled  SEND_FALSE 不发送
void PrintVarFormat(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const uint8_t *font, float var, rt_uint8_t send)
{
    char var_buff[20];              //用来存ASCII码
    u8g2_SetFont(u8g2, font);       //设定字体
    sprintf(var_buff, "%.2f", var);  //传递变量（十进制（占四格））
    u8g2_DrawStr(u8g2, x, y, var_buff); //加载到缓存
    if (send) {
        u8g2_SendBuffer(u8g2);              //发送到屏幕
    }
}

//--------------显示文字---------------------------
//u8g2_t *u8g2                  结构体指针
//u8g2_uint_t x, u8g2_uint_t y  x\y坐标
//const uint8_t *font           字体
//char * text                   要传入的字符指针
//rt_uint8_t send               SEND_TRUE 发送到oled  SEND_FALSE 不发送
void PrintTextFormat(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const uint8_t *font, char * text, rt_uint8_t send)
{
    u8g2_SetFont(u8g2, font);      //设置字体
    u8g2_DrawStr(u8g2, x, y, text);//加载到缓存

    if (send) {
        u8g2_SendBuffer(u8g2);              //发送到屏幕
    }
}

//--------------显示xbm图片---------------------------
//u8g2_t *u8g2                  结构体指针
//u8g2_uint_t x, u8g2_uint_t y  x\y坐标
//u8g2_uint_t w, u8g2_uint_t h  图像的宽、高
//const uint8_t *bitmap         xbm数组指针
//rt_uint8_t send               SEND_TRUE 发送到oled  SEND_FALSE 不发送
void PrintImageFormat(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t h, const uint8_t *bitmap, rt_uint8_t send)
{
    u8g2_DrawXBMP(u8g2, x, y, w, h, bitmap);//加载到缓存
    if (send) {
        u8g2_SendBuffer(u8g2);              //发送到屏幕
    }
}

//--------------显示图形字符---------------------------
//需要找到对应的字体、和字形索引
//参考  https://github.com/olikraus/u8g2/wiki/fntgrpiconic  或
//https://www.jerrycoding.com/tool/u8g2lib/#:~:text=U8g2%E5%AD%97%E4%BD%93%E5%BA%93%E5%A4%A7%E5%85%A8,%28%E9%A2%84%E8%A7%88%E5%9B%BE%29%EF%BC%8C%E6%9D%A5%E8%87%AAhttps%3A%2F%2Fgithub.com%2Folikraus%2Fu8g2%2Fwiki%2Ffntgrpiconic
//u8g2_t *u8g2                  结构体指针
//u8g2_uint_t x, u8g2_uint_t y  x\y坐标
//const uint8_t *font           字体
//char * text                   字符索引
//rt_uint8_t send               SEND_TRUE 发送到oled  SEND_FALSE 不发送
void PrintIconicFormat(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, const uint8_t *font, uint16_t encoding, rt_uint8_t send)
{
    u8g2_SetFont(u8g2, font);            //设置字体
    u8g2_DrawGlyph(u8g2, x, y, encoding);//加载到缓存
    if (send) {
        u8g2_SendBuffer(u8g2);           //发送到屏幕
    }
}


//--------------测试---------------------------
void OledDisplayCheck(void)
{
    //初始化
    OledDisplayInit(&u8g2);

    //显示字符
    char text[]={"this is a test!"};
    PrintTextFormat(&u8g2, 2, 10, u8g2_font_wqy12_t_gb2312a, text, SEND_FALSE);

    //显示数字变量
    float data = 9.8;
    PrintVarFormat(&u8g2,50,56,u8g2_font_wqy12_t_gb2312a,data, SEND_FALSE);

//    u8g2_enableUTF8Print()
//    //画一个水平线
//    u8g2_DrawHLine(&u8g2, 0, 35, 60);
//
//    //将缓冲区里的所有东西打包发送
    u8g2_SendBuffer(&u8g2);
//
//    //延时一秒后清除
//    rt_thread_delay(1000);
//    u8g2_ClearBuffer(&u8g2);
//
//
//    //显示一个字符字形
//    PrintIconicFormat(&u8g2, 50, 50, u8g2_font_open_iconic_www_4x_t, 0x51, SEND_TRUE);
//
//    //延时一秒后清除
//    rt_thread_delay(1000);
//    u8g2_ClearBuffer(&u8g2);


//    //绘画一个xbm图片
//    static const unsigned char U8g_logo_bits[] U8X8_PROGMEM =
//    {
//     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF,
//     0xFF, 0xFF, 0xFF, 0x67, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF,
//     0xFF, 0x1F, 0x00, 0x80, 0xFE, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF,
//     0x07, 0xFE, 0x0F, 0xF8, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xE1,
//     0xFF, 0xFF, 0xE1, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x3F, 0xFC, 0xFF,
//     0xFF, 0x8F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF,
//     0x1F, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xCF, 0xFF, 0xFF, 0xFF, 0x7F,
//     0xFC, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9,
//     0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xF1, 0xF3, 0xCF, 0xFE, 0xFF, 0xF1, 0x3F,
//     0xFF, 0x1F, 0xFF, 0xFF, 0x7C, 0xE0, 0x0F, 0xC0, 0xFF, 0xE7, 0x0F, 0xFE,
//     0x1F, 0xFF, 0xFF, 0x3C, 0xF4, 0x07, 0x80, 0xFF, 0xCF, 0x0F, 0xFE, 0x1F,
//     0xFF, 0x7F, 0xBE, 0xF8, 0xF3, 0xFF, 0xFF, 0x9F, 0xBF, 0xFF, 0x1F, 0xFF,
//     0x3F, 0xFF, 0xF7, 0xE1, 0xFF, 0xFF, 0x9F, 0xFF, 0xFF, 0x1F, 0xFF, 0x3F,
//     0xFF, 0xDF, 0xF5, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x1F, 0xFF, 0x9F, 0xFF,
//     0xFF, 0x1F, 0xE0, 0xFF, 0x3F, 0xFF, 0xFF, 0x1F, 0xFF, 0xDF, 0x7F, 0xF0,
//     0x1F, 0xC0, 0xFF, 0x7F, 0xFE, 0xFF, 0x1F, 0xFF, 0xCF, 0x3F, 0xFC, 0x7F,
//     0xFC, 0xFF, 0xFF, 0xFC, 0xFF, 0x1F, 0xFF, 0xCF, 0xFF, 0xFC, 0xFF, 0xF9,
//     0xFF, 0xFF, 0xFC, 0xFF, 0x1F, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
//     0xFF, 0xFD, 0xFF, 0x1F, 0xFF, 0xE7, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
//     0xF9, 0xFF, 0x1F, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF9,
//     0xFF, 0x1F, 0xFF, 0xF3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF,
//     0x1F, 0xFF, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xFF, 0x1F,
//     0xFF, 0xF3, 0xFF, 0xFF, 0x7F, 0xFF, 0xFF, 0xFF, 0xF3, 0xFF, 0x1F, 0xFF,
//     0xF3, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xF3, 0xFF, 0x1F, 0xFF, 0xF3,
//     0x7F, 0x63, 0xF0, 0xF8, 0xFF, 0xFF, 0xF3, 0xFF, 0x1F, 0xFF, 0xFB, 0xFF,
//     0x0C, 0xFA, 0xFB, 0xFF, 0xFF, 0xF3, 0xFF, 0x1F, 0xFF, 0xF3, 0xFF, 0xFE,
//     0xFF, 0xF3, 0xFF, 0xFF, 0xF3, 0xFF, 0x1F, 0xFF, 0xF3, 0xFF, 0xFE, 0xFF,
//     0xFF, 0xFF, 0xFF, 0xF7, 0xFF, 0x1F, 0xFF, 0xF7, 0xFF, 0xFF, 0x0E, 0xFE,
//     0xFF, 0xFF, 0xF3, 0xFF, 0x1F, 0xFF, 0xF3, 0xFF, 0x0B, 0xE9, 0xFE, 0xFF,
//     0xFF, 0xF3, 0xFF, 0x1F, 0xFF, 0xF7, 0xFF, 0xDE, 0xFF, 0xFD, 0xFF, 0xFF,
//     0xF3, 0xFF, 0x1F, 0xFF, 0xE7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB,
//     0xFF, 0x1F, 0xFF, 0xE7, 0xFF, 0xFF, 0xF3, 0xFF, 0xF9, 0xFF, 0xF9, 0xFF,
//     0x1F, 0xFF, 0xCF, 0xFF, 0x0F, 0xF8, 0xFF, 0xF0, 0xFF, 0xF9, 0xFF, 0x1F,
//     0xFF, 0xCF, 0xFF, 0x0F, 0xFC, 0x7F, 0xF2, 0xFF, 0xFC, 0xFF, 0x1F, 0xFF,
//     0x9F, 0xFF, 0x3F, 0xFE, 0x7F, 0xE6, 0xFF, 0xFC, 0xFF, 0x1F, 0xFF, 0x9F,
//     0xFF, 0xFF, 0xFF, 0x1F, 0xF2, 0x7F, 0xFE, 0xFF, 0x1F, 0xFF, 0x3F, 0xFF,
//     0xFF, 0xFF, 0xDF, 0xE7, 0x3F, 0xFF, 0xFF, 0x1F, 0xFF, 0x7F, 0xFE, 0xFF,
//     0xFF, 0xCF, 0xE7, 0x1F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFC, 0xFF, 0xFF,
//     0xCF, 0x0F, 0xCE, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xF1, 0xFF, 0xFF, 0xEF,
//     0x1F, 0xCC, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0xCF, 0xFF,
//     0xCF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x0F, 0xFF, 0xFF, 0x9F, 0xFF, 0x9F,
//     0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0x3F, 0xF0, 0xFF, 0x1F, 0xFD, 0xBF, 0xFF,
//     0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0x7F, 0xFC, 0x3F, 0xFF, 0xFF,
//     0x1F, 0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x1F,
//     0xFF, 0xFF, 0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x1F, 0xFF,
//     0xFF, 0xFF, 0xFB, 0xFF, 0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF,
//     0xFF, 0xF9, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF,
//     0xF9, 0xFF, 0xFF, 0xFF, 0xBF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFB,
//     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
//     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
//     0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
//     0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
//     0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
//     0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
//     0x1F, 0xFF, 0xFF, 0xFF, 0xF7, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F,
//     0xC7, 0xFF, 0xFF, 0xF7, 0xFD, 0xFC, 0xFF, 0x7F, 0xFE, 0xE7, 0x19, 0xD3,
//     0x93, 0x6D, 0x92, 0x79, 0xFA, 0xDF, 0xED, 0x77, 0xB3, 0x1B, 0xDB, 0x85,
//     0x40, 0x1A, 0x7B, 0x92, 0xA2, 0x40, 0x20, 0x18, 0x1A, 0x93, 0x44, 0x5A,
//     0x9A, 0x79, 0x3B, 0x08, 0x96, 0x89, 0x98, 0x1B, 0xD3, 0x4D, 0x12, 0x5B,
//     0x7B, 0x3A, 0xA9, 0x96, 0x88, 0x78, 0x12, 0xC7, 0xD1, 0x46, 0x1B, 0xE1,
//     0x38, 0x0D, 0x56, 0x69, 0x16, 0x1B, 0xFF, 0xFF, 0xFF, 0xB3, 0xE5, 0xFF,
//     0xFF, 0xFF, 0x3F, 0xB4, 0x19, 0xFF, 0xFF, 0xFF, 0xF7, 0xFE, 0xFF, 0xFF,
//     0xFF, 0x7F, 0xE6, 0x1D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
//     0xFF, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
//     0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
//     0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F,
//     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF,
//     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0xFF, 0xFF,
//     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F};
//    PrintImageFormat(&u8g2, 20, -3, 85, 75, U8g_logo_bits, SEND_TRUE);

}
MSH_CMD_EXPORT(OledDisplayCheck, oled display check);



//---------------------------------------























